const { app, BrowserWindow, protocol, Menu } = require('electron');
const path = require('path');
const url = require('url');

// 解决GPU进程崩溃问题 - 禁用GPU加速
app.disableHardwareAcceleration();


// 必须在app ready事件之前注册协议方案
protocol.registerSchemesAsPrivileged([{
    scheme: 'app', privileges: {
        secure: true,
        standard: true,
        supportFetchAPI: true,
        bypassCSP: true,
        corsEnabled: true,
        stream: true,
        allowServiceWorkers: true,
        supportES6: true,
        fetchExternalResources: ['*'],
        scriptable: true
    }
}, {
    scheme: 'http', privileges: {
        secure: true,
        standard: true,
        supportFetchAPI: true,
        bypassCSP: true,
        corsEnabled: true,
        stream: true,
        allowServiceWorkers: true,
        supportES6: true,
        fetchExternalResources: ['*'],
        scriptable: true
    }
}, {
    scheme: 'https', privileges: {
        secure: true,
        standard: true,
        supportFetchAPI: true,
        bypassCSP: true,
        corsEnabled: true,
        stream: true,
        allowServiceWorkers: true,
        supportES6: true,
        fetchExternalResources: ['*'],
        scriptable: true
    }
}]);

// 保持对窗口对象的全局引用，防止JavaScript对象被垃圾回收时窗口被自动关闭
let mainWindow;

function createWindow() {
    // 创建浏览器窗口 - 不显示窗口，稍后会最大化后再显示
    mainWindow = new BrowserWindow({
        show: false, webPreferences: {
            preload: path.join(__dirname, 'preload.js'), // 禁用节点集成，提高安全性
            nodeIntegration: false, // 启用上下文隔离
            contextIsolation: true, // 启用远程模块
            enableRemoteModule: false
        }
    });
    
    // 窗口准备好显示时最大化窗口
    mainWindow.once('ready-to-show', () => {
        mainWindow.maximize(); // 最大化窗口
        mainWindow.show(); // 显示窗口
    });
    let startUrl = process.env.ELECTRON_START_URL || url.format({
        pathname: path.join(__dirname, 'vscode-layout-demo', 'index.html'),
        protocol: 'file:',
        slashes: true
    });

    if (process.env.NODE_ENV === 'development') {
        // 加载应用的index.html - 从electron-dist目录加载，因为这是构建后的目标目录
         startUrl = process.env.ELECTRON_START_URL || url.format({
            pathname: path.join(__dirname, '../electron-dist', 'vscode-layout-demo', 'index.html'),
            protocol: 'file:',
            slashes: true
        });
    }
    mainWindow.loadURL(startUrl);

    // 在开发模式下，自动打开开发者工具以便调试
    if (process.env.NODE_ENV === 'development') {
        mainWindow.webContents.openDevTools();
    }

    // 窗口关闭时触发
    mainWindow.on('closed', function () {
        // 取消引用窗口对象，如果应用支持多窗口，通常会把多个窗口保存在一个数组中
        // 此时应该删除相应的元素
        mainWindow = null;
    });
}

// 在app.whenReady()中创建窗口，这是Electron推荐的初始化方式
app.whenReady().then(() => {
    // 禁用默认菜单
    Menu.setApplicationMenu(null);
    // 创建窗口
    createWindow();

    app.on('activate', function () {
        // 在macOS上，当点击dock图标且没有其他窗口打开时，通常会重新创建一个窗口
        if (BrowserWindow.getAllWindows().length === 0) {
            createWindow();
        }
    });
});

// 所有窗口关闭时退出应用
app.on('window-all-closed', function () {
    // 在macOS上，除非用户用Cmd+Q确定退出，否则绝大部分应用及其菜单栏会保持激活
    if (process.platform !== 'darwin') {
        app.quit();
    }
});

// 激活事件处理已移至app.whenReady()内部

// 处理证书错误，自动忽略跨域限制
app.on('certificate-error', (event, webContents, url, error, certificate, callback) => {
    event.preventDefault();
    callback(true);
});

// 允许所有网络请求，忽略跨域限制
app.on('session-created', (session) => {
    session.webRequest.onBeforeSendHeaders((details, callback) => {
        // 允许跨域请求
        callback({requestHeaders: {...details.requestHeaders}});
    });

    session.webRequest.onHeadersReceived((details, callback) => {
        // 设置CORS头，允许所有来源
        callback({
            responseHeaders: {
                ...details.responseHeaders,
                'Access-Control-Allow-Origin': ['*'],
                'Access-Control-Allow-Methods': ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
                'Access-Control-Allow-Headers': ['Content-Type', 'Authorization']
            }
        });
    });
});
